<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var arr = [];
        //1.用var声明
        for (var i = 0; i < 2; i++) {
            arr[i] = function () {
                console.log(i);//结果是2 2
                //这里的变量i是全局的，函数执行时都是全局作用域下i的值
            }
        }
        //1.用let声明
        for (let i = 0; i < 2; i++) {
            arr[i] = function () {
                console.log(i);  //结果是0和1
            }
            //关键点在于每次循环产生的一个块级作用域，每个款及作用域中的变量是不同的，
            //函数执行输出的是自己的上一级(循环产生的块级作用域)作用域下i的值
        }
        arr[0]();
        arr[1]();

        //解释1：function()会等循环结束后才会执行，循环结束后的i值会变成2了
        //解释2：for循环()如果用var声明变量，该会使一个全局变量，所以i是一个全局变量，在
        //调用时因为循环结束了，所以i的循环结束条件的2,所以打印出来的结果是2
        //解释3：因为没有块级作用域造成这种现象
        //解释4：最后调用函数的时候，才上去查找i是多少，let就分别输出自己的i值，var的就是输出全局作用域下的值
    </script>
</body>

</html>